 import java.io.BufferedReader;
 import java.io.FileReader;
 public class programa {
  private String ruta; 
  private archivo fl;
  private int x;
  private String error;
  private tabla tab;
  public programa(String direccion){
   ruta=direccion;
   x=-1;
   String[] columnas={"tipo","objeto","valor","estado"};
   tab=new tabla(columnas,100);
   error=new String("");
  }
  protected String getError(){
   return error;
  }
  protected int obtenerLineas(){
    String linea;
    x=-1;
    fl=new archivo(ruta);
    BufferedReader br1=new BufferedReader(fl.darBuffer());
    try{
     while((linea=br1.readLine())!=null){
      x++;
     }
     fl.cerrar();
    }
    catch(Exception e){
     e.printStackTrace();
    }
   return x+1;
  } 
  protected void construir(){
   fl=new archivo(ruta);
   x=-1;
   String linea;
   String s;
   Object[] tmp;
   Object[] obj;
   Object[] primo;
   BufferedReader br2=new BufferedReader(fl.darBuffer());
   compilador comp=new compilador();
   try{
    while((linea=br2.readLine())!=null){
     x++;
     // si tiene la forma de una declaracion entonces
     tmp=comp.compilar(-1,linea);
     if(tmp[0]==Boolean.FALSE){
      tmp=comp.compilar(0,linea);
      if(tmp[0]==Boolean.FALSE){
       tmp=comp.compilar(1,linea);
       if(tmp[0]==Boolean.FALSE){
        tmp=comp.compilar(2,linea);
        if(tmp[0]==Boolean.FALSE){
         tmp=comp.compilar(3,linea);
         if(tmp[0]==Boolean.FALSE)
         {
          tmp=comp.compilar(4,linea);
	  if(tmp[0]==Boolean.FALSE){
           //System.out.println("Linea "+(x+1)+": "+tmp[1].toString());
           error+="Linea "+(x+1)+": "+tmp[1].toString()+"\n";
	  }
	  else
          {
           String[] variables={new String("cierre"),new String(tmp[2].toString()),new String(linea),new String("")};
	   tab.addFila(variables);
           String[] registro=tab.posFiltro(tab.getCont(),"arriba","estado","abierto");
	   if(registro.length>0 && registro[0]!=null){
	    if(registro[1].equals(tmp[2].toString())==false){
	     //System.out.println("Linea "+(x+1)+": "+tmp[1].toString());
             error+="Linea "+(x+1)+": "+tmp[1].toString()+"\n";
	    }
	    else
	    {
	     tab.updValue(tab.obtCursor(),"estado","cerrado");
	    }
	   }
	   else
	   {
            //System.out.println("Linea "+(x+1)+": "+linea);
            error+="Linea "+(x+1)+": "+linea+"\n";
	   }
	  }
         }
	 else
         {
          String[] variables={new String("estructura"),new String(tmp[2].toString()),new String(linea),new String("abierto")};
	  tab.addFila(variables);
	 }
        }
        else
        {
         String tmplinea=linea.replaceAll("(\\(|\\)|\\*|\\+|/|%|=|\\-|;)",","); 
         tmplinea=tmplinea.replaceAll("( )+","");
         String[] vars=tmplinea.split("(,)+");
         int tmpidx=-1;
         String tipobase="";
         for(int v=0;v<vars.length;v++){  
          tmpidx=tab.searchRecord("objeto",vars[v]);
           System.out.println(vars[v]);
          if(tmpidx>=0)
          {
           String[] varinfo=tab.obtRecord(tmpidx);
           if(v==0)
           {
            tipobase=new String(varinfo[0]);  
           }
           //validar si tanto las variables como los valores involucrados en la operacion son del mismo tipo
           if(tipobase.equals(varinfo[0])==false){
           // System.out.println("Linea "+(x+1)+": "+linea+" Error, Las variables no son del mismo tipo");
            error+="Linea "+(x+1)+": "+linea+" Error, Las variables no son del mismo tipo\n";
            break;
           }
          }
          else
          {
           tmp=comp.compilar(5,linea);
           if(tmp[0]==Boolean.FALSE){
            //System.out.println("Linea "+(x+1)+": "+linea+" Error, el valor de la variable es invalido");
            error+="Linea "+(x+1)+": "+linea+" Error, el valor de la variable es invalido\n";
            break;
           }
           else
           {
            if(tipobase.equals(tmp[2].toString())==false){
             //System.out.println("Linea "+(x+1)+": "+linea+" Error, Las variables no son del mismo tipo");
             error+="Linea "+(x+1)+": "+linea+" Error, Las variables no son del mismo tipo\n";
             break;
            }
           }
          }  
         }
        }
       }
      else
       {
	try{
         obj=comp.obtVars(linea);
         primo=(Object [])obj[2];
         for(int t=0;t<Integer.parseInt(obj[1].toString());t++){
	  String[] variables={new String(obj[0].toString()),new String(primo[t].toString()),new String(""),new String("")};
	  tab.addFila(variables);
         }
	}
        catch(Exception e){
         e.printStackTrace();       
	}
       }
      }
     }
    }
   }
   catch(Exception e){
    e.printStackTrace();
   }
  }
 /*public static void main(String[] args) {
  programa p=new programa("muestra.txt");
  p.construir();
  System.out.println(p.getError());
 }*/
}
